/*
    本章内容
        1.通过变量使用原始值与引用值
        2.理解执行上下文
        3.理解垃圾回收

    4.1原始值与引用值
        原始值：就是最简单的数据
            String、Number、Boolean、Undefined、Null、Symbol。
            保存原始值的变量是按值（by value）访问的，因为我们操作的就是存储在变量中的实际值。
        引用值：由多个值构成的对象
            引用值是保存在内存中的对象。JS不允许直接访问内存地址，因此不能直接操作对象所在的内存空间。在操作对象时，实际上操作的是对该对象的引用而非实际的对象本身。
            保存引用值的变量是按引用（by reference）访问的。
        4.1.1动态属性
            原始值和引用值都是创建一个变量，然后给它附一个值。
            引用值可以随时添加、修改和删除其属性和方法。
            原始值也可以添加属性不会报错，但是无效。
            只要是new一个关键字创建的都是对象，虽然操作和原始值差不多。
        4.1.2 复制值
            原始值：变量把一个原始值复制到另一个变量时，原始值会被复制到新变量的位置。
            引用值：把引用值从一个变量赋值给另一个变量时，存储在变量中的值也会被复制到新变量所在位置。
                展开：这里复制的实际上是个指针，它指向存储在堆内存中的对象。实际上两个变量指向的是同一个对象，所以一个对象的变化会在另一个对象上反映出来。
        4.1.3 传递参数
            es中的参数是局部变量
            js中所有的函数的参数都是按值传递的。这意味着函数外部的值会被复制到函数内部的参数中。和复制一样，原始值复制值，引用值复制对象指向。
        4.1.4 确定类型
            instanceof操作符
            如果用 instanceof检测原始值始终返回false，用instanceof检测引用值返回如果是比较Object的话则会始终返回true
    4.2 执行上下文与作用域
        
*/
const fun = function () {
    return 1
}
console.log(typeof (fun))
const arr = new Array()
console.log(typeof (arr))
console.log(arr instanceof Array)
console.log(arr instanceof Object)
console.log(arr instanceof RegExp)
console.log(arr instanceof Map)